package tyk.common;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.Map;

/*
* 生成和解析jwt令牌的工具类
* */

@Component
@Data
public class JwtUtil {

    private byte[] SECRET_KEY; // 密钥，需要自行设置

    @Value("3600000")
    private long EXPIRATION_TIME; // 有效期为1小时

    public JwtUtil() {

        SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256).getEncoded();  //通过无参构造函数每次随机设置密钥

    }

    // 生成JWT令牌
    public String generateJwtToken(Map<String, Object> map) {  //传入一个map集合，返回jwt令牌(String类型)

        Date now = new Date();
        Date expiration = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setClaims(map)
                .setIssuedAt(now)
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // 解密JWT令牌
    public Claims verifyAndDecodeJwtToken(String token) {  //传入jwt令牌，解析令牌中加密的内容，并且返回map
        try {

            return Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();

        } catch (Exception e) {
            return null; // 验证失败
        }
    }

}
